package com.yami.shop.api.utils;

import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
@Slf4j
public class HttpClient {


    //取当前日期
    public static String getYYYYMMDD(){
        SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMdd");
        return sdf.format(System.currentTimeMillis());
    }
    //取当前日期
    public static String getDateTime(){
        SimpleDateFormat sdf= new SimpleDateFormat("yyyyMMddHHmmss");
        return  sdf.format(System.currentTimeMillis());

    }
    //随机文件名
    public static String getRandomFileName(){
        String f="f"+System.currentTimeMillis()+RandomUtil.doGenerate(6);
        return f;

    }

    //下载图片到指定目录，生成随机文件名
    public static String downloadToDir(String url,String dir) throws Exception {
        //以上期为子目录，是否存在
        String subDir=getYYYYMMDD();
        File f=new File(dir+subDir);
        if(f.exists()){

        }else{
            f.mkdirs();
        }
        String fileName=dir+subDir+"/"+getRandomFileName();
        fileName=download(url,fileName);
        return  fileName;
    }

    //通过url下载图片保存到本地

    public static String download(String urlString, String fileName) throws Exception {

        // 构造URL

        URL url = new URL(urlString);

        // 打开连接

        HttpURLConnection  con = (HttpURLConnection)url.openConnection();
        con.setInstanceFollowRedirects(true);


        // 输入流

        InputStream is = con.getInputStream();




        // 1K的数据缓冲

        byte[] bs = new byte[1024];

        // 读取到的数据长度

        int len;

        Map<String, List<String>> map = con.getHeaderFields();


        log.info("显示响应Header信息...\n");

        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            log.info("Key : " + entry.getKey() +
                    " ,Value : " + entry.getValue());
        }
        // 输出的文件流


        String type=con.getContentType();

        if(MyUtil.isNotEmpty(type)) {
            if (type.startsWith("image")) {
                String code = type.substring(6);
                fileName = fileName + "." + code;
            }
        }

        File file = new File(fileName);

        FileOutputStream os = new FileOutputStream(file, true);

        // 开始读取

        while ((len = is.read(bs)) != -1) {

            os.write(bs, 0, len);

        }



        // 完毕，关闭所有链接

        os.close();

        is.close();
        return fileName;

    }

    public static String get(String geturl){
        String msg = "";
        try {
            //GET请求是可以拼接参数的，依照之前用？拼接即可，例如：http://httpbin.org/get?username=123456&password=123456
            // 1. 得到访问地址的URL
            URL url = new URL(geturl);
            // 2. 得到网络访问对象java.net.HttpURLConnection
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            /* 3. 设置请求参数（过期时间，输入、输出流、访问方式），以流的形式进行连接 */
            // 设置是否向HttpURLConnection输出
            connection.setDoOutput(false);
            // 设置是否从HttpUrlConnection读入
            connection.setDoInput(true);
            // 设置请求方式
            connection.setRequestMethod("GET");
            // 设置是否使用缓存
            connection.setUseCaches(true);
            // 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
            connection.setInstanceFollowRedirects(true);
            // 设置超时时间(以毫秒为单位)
            //connection.setConnectTimeout(3000);
            // 连接
            connection.connect();
            // 4. 得到响应状态码的返回值 responseCode
            int code = connection.getResponseCode();
            // 5. 如果返回值正常，数据在网络中是以流的形式得到服务端返回的数据

            if (code == 200) { // 正常响应
                // 从流中读取响应信息
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line = null;
                while ((line = reader.readLine()) != null) { // 循环从流中读取
                    msg += line + "\n";
                }
                reader.close(); // 关闭流
            }
            // 6. 断开连接，释放资源
            connection.disconnect();

            // 显示响应结果
            log.info(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return msg;
    }




}
